home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 5
/
Aminet 5 - March 1995.iso
/
Aminet
/
gfx
/
show
/
amipeg04.lha
/
aMiPEG_0.4
/
decoders.h
< prev
next >
Wrap
C/C++ Source or Header
|
1994-04-22
|
13KB
|
393 lines
/*
* decoders.h
*
* This file contains the declarations of structures required for Huffman
* decoding
*
*/
/* Include util.h for bit i/o parsing macros. */
#include "util.h"
/* Code for unbound values in decoding tables */
#define ERROR -1
#define DCT_ERROR 63
#define MACRO_BLOCK_STUFFING 34
#define MACRO_BLOCK_ESCAPE 35
/* Two types of DCT Coefficients */
#define DCT_COEFF_FIRST 0
#define DCT_COEFF_NEXT 1
/* Special values for DCT Coefficients */
#define END_OF_BLOCK 62
#define ESCAPE 61
/* Structure for an entry in the decoding table of
* macroblock_address_increment */
typedef struct {
char value; /* value for macroblock_address_increment (was unsigned !) */
char num_bits; /* length of the Huffman code */
} mb_addr_inc_entry;
/* Decoding table for macroblock_address_increment */
extern mb_addr_inc_entry mb_addr_inc[2048];
/* Structure for an entry in the decoding table of macroblock_type */
typedef struct {
char data; /* quant motion_forward motion_backward pattern intra */
char num_bits; /* length of the Huffman code */
} mb_type_entry;
#define MB_quant 8
#define MB_motion_forw 4
#define MB_motion_back 2
#define MB_pattern 1
/* Decoding table for macroblock_type in intra-coded pictures */
extern mb_type_entry mb_type_I[4];
/* Decoding table for macroblock_type in predictive-coded pictures */
extern mb_type_entry mb_type_P[64];
/* Decoding table for macroblock_type in bidirectionally-coded pictures */
extern mb_type_entry mb_type_B[64];
/* Structure for an entry in the decoding table of motion vectors */
typedef struct {
char code; /* value for motion_horizontal_forward_code,
* motion_vertical_forward_code,
* motion_horizontal_backward_code, or
* motion_vertical_backward_code.
*/
char num_bits; /* length of the Huffman code */
} motion_vectors_entry;
/* Decoding table for motion vectors */
extern motion_vectors_entry motion_vectors[2048];
/* DCT coeff tables. */
#define RUN_MASK 0xfc00
#define LEVEL_MASK 0x03f0
#define NUM_MASK 0x000f
#define RUN_SHIFT 10
#define LEVEL_SHIFT 4
/* External declaration of dct coeff tables. */
extern unsigned short int dct_coeff_tbl_0[256];
extern unsigned short int dct_coeff_tbl_1[16];
extern unsigned short int dct_coeff_tbl_2[4];
extern unsigned short int dct_coeff_tbl_3[4];
extern unsigned short int dct_coeff_next[256];
extern unsigned short int dct_coeff_first[256];
/*
*--------------------------------------------------------------
*
* DecodeDCTDCSizeLum --
*
* Huffman Decoder for dct_dc_size_luminance; location where
* the result of decoding will be placed is passed as argument.
* The decoded values are obtained by doing a table lookup on
* dct_dc_size_luminance.
*
* Results:
* The decoded value for dct_dc_size_luminance or ERROR for
* unbound values will be placed in the location specified.
*
* Side effects:
* Bit stream is irreversibly parsed.
*
*--------------------------------------------------------------
*/
#define DecodeDCTDCSizeLum(macro_val) macro_val = s_DecodeDCTDCSizeLum()
/*
*--------------------------------------------------------------
*
* DecodeDCTDCSizeChrom --
*
* Huffman Decoder for dct_dc_size_chrominance; location where
* the result of decoding will be placed is passed as argument.
* The decoded values are obtained by doing a table lookup on
* dct_dc_size_chrominance.
*
* Results:
* The decoded value for dct_dc_size_chrominance or ERROR for
* unbound values will be placed in the location specified.
*
* Side effects:
* Bit stream is irreversibly parsed.
*
*--------------------------------------------------------------
*/
#define DecodeDCTDCSizeChrom(macro_val) macro_val = s_DecodeDCTDCSizeChrom()
/*
*--------------------------------------------------------------
*
* decodeDCTCoeff --
*
* Huffman Decoder for dct_coeff_first and dct_coeff_next;
* locations where the results of decoding: run and level, are to
* be placed and also the type of DCT coefficients, either
* dct_coeff_first or dct_coeff_next, are being passed as argument.
*
* The decoder first examines the next 8 bits in the input stream,
* and perform according to the following cases:
*
* '0000 0000' - examine 8 more bits (i.e. 16 bits total) and
* perform a table lookup on dct_coeff_tbl_0.
* One more bit is then examined to determine the sign
* of level.
*
* '0000 0001' - examine 4 more bits (i.e. 12 bits total) and
* perform a table lookup on dct_coeff_tbl_1.
* One more bit is then examined to determine the sign
* of level.
*
* '0000 0010' - examine 2 more bits (i.e. 10 bits total) and
* perform a table lookup on dct_coeff_tbl_2.
* One more bit is then examined to determine the sign
* of level.
*
* '0000 0011' - examine 2 more bits (i.e. 10 bits total) and
* perform a table lookup on dct_coeff_tbl_3.
* One more bit is then examined to determine the sign
* of level.
*
* otherwise - perform a table lookup on dct_coeff_tbl. If the
* value of run is not ESCAPE, extract one more bit
* to determine the sign of level; otherwise 6 more
* bits will be extracted to obtain the actual value
* of run , and then 8 or 16 bits to get the value of level.
*
*
*
* Results:
* The decoded values of run and level or ERROR for unbound values
* are placed in the locations specified.
*
* Side effects:
* Bit stream is irreversibly parsed.
*
*--------------------------------------------------------------
*/
#define DecodeDCTCoeff(dct_coeff_tbl, run, level) run = s_DecodeDCTCoeff(dct_coeff_tbl, &level)
/*
*--------------------------------------------------------------
*
* decodeDCTCoeffFirst --
*
* Huffman Decoder for dct_coeff_first. Locations for the
* decoded results: run and level, are being passed as
* arguments. Actual work is being done by calling DecodeDCTCoeff,
* with the table dct_coeff_first.
*
* Results:
* The decoded values of run and level for dct_coeff_first or
* ERROR for unbound values are placed in the locations given.
*
* Side effects:
* Bit stream is irreversibly parsed.
*
*--------------------------------------------------------------
*/
#define DecodeDCTCoeffFirst(runval, levelval) DecodeDCTCoeff(dct_coeff_first, runval, levelval)
/*
*--------------------------------------------------------------
*
* decodeDCTCoeffNext --
*
* Huffman Decoder for dct_coeff_first. Locations for the
* decoded results: run and level, are being passed as
* arguments. Actual work is being done by calling DecodeDCTCoeff,
* with the table dct_coeff_next.
*
* Results:
* The decoded values of run and level for dct_coeff_next or
* ERROR for unbound values are placed in the locations given.
*
* Side effects:
* Bit stream is irreversibly parsed.
*
*--------------------------------------------------------------
*/
#define DecodeDCTCoeffNext(runval, levelval) DecodeDCTCoeff(dct_coeff_next, runval, levelval);
/*
*--------------------------------------------------------------
*
* DecodeMotionVectors --
*
* Huffman Decoder for the various motion vectors, including
* motion_horizontal_forward_code, motion_vertical_forward_code,
* motion_horizontal_backward_code, motion_vertical_backward_code.
* Location where the decoded result will be placed is being passed
* as argument. The decoded values are obtained by doing a table
* lookup on motion_vectors.
*
* Results:
* The decoded value for the motion vector or ERROR for unbound
* values will be placed in the location specified.
*
* Side effects:
* Bit stream is irreversibly parsed.
*
*--------------------------------------------------------------
*/
#ifdef NO_SANITY_CHECKS
#define DecodeMotionVectors(value) value = sn_get_byte_huff(11, (short*)motion_vectors)
#else
#define DecodeMotionVectors(value) value = s_get_byte_huff(11, (short*)motion_vectors)
#endif
/*
*--------------------------------------------------------------
*
* DecodeMBAddrInc --
*
* Huffman Decoder for macro_block_address_increment; the location
* in which the result will be placed is being passed as argument.
* The decoded value is obtained by doing a table lookup on
* mb_addr_inc.
*
* Results:
* The decoded value for macro_block_address_increment or ERROR
* for unbound values will be placed in the location specified.
*
* Side effects:
* Bit stream is irreversibly parsed.
*
*--------------------------------------------------------------
*/
#ifdef NO_SANITY_CHECKS
#define DecodeMBAddrInc(value) value = sn_get_byte_huff(11, (short*)mb_addr_inc)
#else
#define DecodeMBAddrInc(value) value = s_get_byte_huff(11, (short*)mb_addr_inc)
#endif
/*
*--------------------------------------------------------------
*
* DecodeMBTypeB --
*
* Huffman Decoder for macro_block_type in bidirectionally-coded
* pictures;locations in which the decoded results: macroblock_quant,
* macroblock_motion_forward, macro_block_motion_backward,
* macroblock_pattern, macro_block_intra, will be placed are
* being passed as argument. The decoded values are obtained by
* doing a table lookup on mb_type_B.
*
* Results:
* The various decoded values for macro_block_type in
* bidirectionally-coded pictures or ERROR for unbound values will
* be placed in the locations specified.
*
* Side effects:
* Bit stream is irreversibly parsed.
*
*--------------------------------------------------------------
*/
#ifdef NO_SANITY_CHECKS
#define DecodeMBTypeB(data, intra) data=sn_get_bits_huff(6, &intra, (short*)mb_type_B)
#else
#define DecodeMBTypeB(data, intra) data=s_get_bits_huff(6, &intra, (short*)mb_type_B)
#endif
/*
*--------------------------------------------------------------
*
* DecodeMBTypeI --
*
* Huffman Decoder for macro_block_type in intra-coded pictures;
* locations in which the decoded results: macroblock_quant,
* macroblock_motion_forward, macro_block_motion_backward,
* macroblock_pattern, macro_block_intra, will be placed are
* being passed as argument.
*
* Results:
* The various decoded values for macro_block_type in intra-coded
* pictures or ERROR for unbound values will be placed in the
* locations specified.
*
* Side effects:
* Bit stream is irreversibly parsed.
*
*--------------------------------------------------------------
*/
#ifdef NO_SANITY_CHECKS
#define DecodeMBTypeI(data, intra) data=sn_get_bits_huff(2, &intra, (short*)mb_type_I)
#else
#define DecodeMBTypeI(data, intra) data=s_get_bits_huff(2, &intra, (short*)mb_type_I)
#endif
/*
*--------------------------------------------------------------
*
* DecodeMBTypeP --
*
* Huffman Decoder for macro_block_type in predictive-coded pictures;
* locations in which the decoded results: macroblock_quant,
* macroblock_motion_forward, macro_block_motion_backward,
* macroblock_pattern, macro_block_intra, will be placed are
* being passed as argument. The decoded values are obtained by
* doing a table lookup on mb_type_P.
*
* Results:
* The various decoded values for macro_block_type in
* predictive-coded pictures or ERROR for unbound values will be
* placed in the locations specified.
*
* Side effects:
* Bit stream is irreversibly parsed.
*
*--------------------------------------------------------------
*/
#ifdef NO_SANITY_CHECKS
#define DecodeMBTypeP(data, intra) data=sn_get_bits_huff(6,&intra, (short*)mb_type_P)
#else
#define DecodeMBTypeP(data, intra) data=s_get_bits_huff(6,&intra, (short*)mb_type_P)
#endif
/*
*--------------------------------------------------------------
*
* DecodeCBP --
*
* Huffman Decoder for coded_block_pattern; location in which the
* decoded result will be placed is being passed as argument. The
* decoded values are obtained by doing a table lookup on
* coded_block_pattern.
*
* Results:
* The decoded value for coded_block_pattern or ERROR for unbound
* values will be placed in the location specified.
*
* Side effects:
* Bit stream is irreversibly parsed.
*
*--------------------------------------------------------------
*/
#ifdef NO_SANITY_CHECKS
#define DecodeCBP(coded_bp) coded_bp = sn_DecodeCBP()
#else
#define DecodeCBP(coded_bp) coded_bp = s_DecodeCBP()
#endif